package com.sx.pipeline.app

import android.app.Application
import android.content.Context
import android.view.Gravity
import android.widget.ImageView
import androidx.annotation.DrawableRes
import com.alibaba.android.arouter.launcher.ARouter
import com.blankj.utilcode.util.SPUtils
import com.blankj.utilcode.util.ToastUtils
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CircleCrop
import com.bumptech.glide.request.RequestOptions
import com.cretin.www.cretinautoupdatelibrary.model.TypeConfig
import com.cretin.www.cretinautoupdatelibrary.model.UpdateConfig
import com.cretin.www.cretinautoupdatelibrary.utils.AppUpdateUtils
import com.cretin.www.cretinautoupdatelibrary.utils.SSLUtils
import com.scwang.smart.refresh.footer.ClassicsFooter
import com.scwang.smart.refresh.header.ClassicsHeader
import com.scwang.smart.refresh.layout.SmartRefreshLayout
import com.sx.mvvmlibs.base.BaseApp
import com.sx.mvvmlibs.http.HttpRequest
import com.sx.pipeline.BuildConfig
import com.sx.pipeline.R
import com.sx.pipeline.app.config.SPKey
import com.sx.pipeline.app.di.allModule
import com.sx.pipeline.repos.http.res.UpdateModel
import com.sx.pipeline.ui.setting.update.CustomUpdateActivity
import com.sx.pipeline.utils.OkHttp3Connection
import com.tencent.bugly.crashreport.CrashReport
import io.reactivex.rxjava3.plugins.RxJavaPlugins
import io.rong.imkit.GlideKitImageEngine
import io.rong.imkit.IMCenter
import io.rong.imkit.RongIM
import io.rong.imkit.config.RongConfigCenter
import io.rong.imkit.conversation.extension.RongExtensionManager
import io.rong.imlib.model.Conversation
import io.rong.imlib.model.Message
import io.rong.sight.SightExtensionModule
import okhttp3.OkHttpClient
import org.koin.core.context.startKoin
import java.util.concurrent.TimeUnit


/**
 * @Author: YY
 * @Date: 2022/4/5
 * @Description:
 */
class PLApplication : BaseApp() {

    init {
        SmartRefreshLayout.setDefaultRefreshInitializer { _, layout ->
            layout.apply {
                setEnableOverScrollDrag(true)
                setEnableScrollContentWhenLoaded(true)
                setEnableAutoLoadMore(true)
                setEnableOverScrollBounce(true)
                setEnableFooterTranslationContent(true)
            }
        }
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator { context, layout ->
            layout.setPrimaryColorsId(com.sx.mvvmlibs.R.color.c_f3f4f6, com.sx.mvvmlibs.R.color.c_333333)
            ClassicsHeader(context)
        }
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator { context, layout ->
            ClassicsFooter(context)
                .setFinishDuration(0)
                .setPrimaryColorId(com.sx.mvvmlibs.R.color.c_f3f4f6)
                .setDrawableSize(20f)
        }
    }

    override fun onCreate() {
        super.onCreate()
        // 初始化ARouth
        initARouter(this)
        // 初始化配置
        initConfig()
        // 初始化融云
        initRong()
        // 初始化版本更新
        initUpdate()
        // 设置Toast统一样式
        initToast()
        // 开启依赖
        startKoin {
            modules(allModule)
        }

        // Bugly异常上报
        CrashReport.initCrashReport(this, "fe954c1238", true)
    }

    /**
     * 设置Toast统一样式
     */
    private fun initToast() {
        val defaultMaker = ToastUtils.getDefaultMaker()
        defaultMaker.setBgColor(this.resources.getColor(com.sx.mvvmlibs.R.color.c_333333))
        defaultMaker.setGravity(Gravity.CENTER,0,0)
        defaultMaker.setTextColor(this.resources.getColor(R.color.white))
    }

    private fun initARouter(app: Application) {
        if (BuildConfig.DEBUG) {
            // 打印日志
            ARouter.openLog()
            // 开启调试模式 TODO 线上版本需要关闭, 否则有安全风险
            ARouter.openDebug()
        }
        // 初始化
        ARouter.init(app)
    }

    /**
     * 初始化融云
     */
    private fun initRong() {
        //初始化融云 step3
        val appKey = getString(R.string.rong_im_key)
        RongIM.init(this, appKey)
        //注册融云小视频模块
        RongExtensionManager.getInstance().registerExtensionModule(SightExtensionModule())
        RongConfigCenter.featureConfig().kitImageEngine = object : GlideKitImageEngine() {
            override fun loadConversationListPortrait(
                context: Context,
                url: String,
                imageView: ImageView,
                conversation: Conversation
            ) {
                @DrawableRes var resourceId = io.rong.imkit.R.drawable.rc_default_portrait
                when (conversation.conversationType) {
                    Conversation.ConversationType.GROUP -> resourceId =
                        io.rong.imkit.R.drawable.rc_default_group_portrait
                    Conversation.ConversationType.CUSTOMER_SERVICE -> resourceId =
                        io.rong.imkit.R.drawable.rc_cs_default_portrait
                    Conversation.ConversationType.CHATROOM -> resourceId =
                        io.rong.imkit.R.drawable.rc_default_chatroom_portrait
                    else -> {}
                }
                Glide.with(imageView)
                    .load(url)
                    .placeholder(resourceId)
                    .error(resourceId)
                    .apply(RequestOptions.bitmapTransform(CircleCrop()))
                    .into(imageView)
            }

            override fun loadConversationPortrait(
                context: Context,
                url: String,
                imageView: ImageView,
                message: Message
            ) {
                @DrawableRes var resourceId = io.rong.imkit.R.drawable.rc_default_portrait
                when (message.conversationType) {
                    Conversation.ConversationType.CUSTOMER_SERVICE -> if (Message.MessageDirection.RECEIVE
                        == message.messageDirection
                    ) resourceId = io.rong.imkit.R.drawable.rc_cs_default_portrait
                    else -> {}
                }
                Glide.with(imageView)
                    .load(url)
                    .placeholder(resourceId)
                    .error(resourceId)
                    .apply(RequestOptions.bitmapTransform(CircleCrop()))
                    .into(imageView)
            }
        }
        RongIM.getInstance().voiceMessageType = IMCenter.VoiceMessageType.HighQuality
    }

    /**
     * 初始化配置信息
     */
    private fun initConfig() {
        // 网络请求需设置 baseUrl
//        var baseUrl= "http://api.gxtapp.com"
        var baseUrl= "http://api.gjb118.com"
        if (BuildConfig.DEBUG) {
            baseUrl=SPUtils.getInstance().getString("baseUrl","http://api.gjb118.com")
        }
        HttpRequest.mBaseUrl = baseUrl
//        HttpRequest.mBaseUrl = "http://192.168.1.39:8081/"
        HttpRequest.addDefaultHeader("token", SPUtils.getInstance().getString(SPKey.SP_TOKEN, ""))

        RxJavaPlugins.setErrorHandler {
            ToastUtils.showShort("系统错误")
            it.printStackTrace()
        }
    }

    private fun initUpdate() {
        //如果你想使用okhttp作为下载的载体，那么你需要自己依赖okhttp，更新库不强制依赖okhttp！可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator start
        val builder = OkHttpClient.Builder()
            .readTimeout(30000, TimeUnit.SECONDS)
            .writeTimeout(
                30000,
                TimeUnit.SECONDS
            ) //如果你需要信任所有的证书，可解决根证书不被信任导致无法下载的问题 start
            .hostnameVerifier(SSLUtils.TrustAllHostnameVerifier()) //如果你需要信任所有的证书，可解决根证书不被信任导致无法下载的问题 end
            .retryOnConnectionFailure(true)
        //如果你想使用okhttp作为下载的载体，那么你需要自己依赖okhttp，更新库不强制依赖okhttp！可以使用如下代码创建一个OkHttpClient 并在UpdateConfig中配置setCustomDownloadConnectionCreator end

        //更新库配置
        val updateConfig = UpdateConfig()
            .setDebug(true) //是否是Debug模式
            .setBaseUrl("http://www.cretinzp.com/system/versioninfo") //当dataSourceType为DATA_SOURCE_TYPE_URL时，配置此接口用于获取更新信息
            .setMethodType(TypeConfig.METHOD_GET) //当dataSourceType为DATA_SOURCE_TYPE_URL时，设置请求的方法
            .setDataSourceType(TypeConfig.DATA_SOURCE_TYPE_URL) //设置获取更新信息的方式
            .setShowNotification(true) //配置更新的过程中是否在通知栏显示进度
            .setNotificationIconRes(R.mipmap.ic_logo) //配置通知栏显示的图标
            .setUiThemeType(TypeConfig.UI_THEME_AUTO) //配置UI的样式，一种有12种样式可供选择
            .setRequestHeaders(null) //当dataSourceType为DATA_SOURCE_TYPE_URL时，设置请求的请求头
            .setRequestParams(null) //当dataSourceType为DATA_SOURCE_TYPE_URL时，设置请求的请求参数\
            .setCustomActivityClass(CustomUpdateActivity::class.java)
            .setAutoDownloadBackground(false) //是否需要后台静默下载，如果设置为true，则调用checkUpdate方法之后会直接下载安装，不会弹出更新页面。当你选择UI样式为TypeConfig.UI_THEME_CUSTOM，静默安装失效，您需要在自定义的Activity中自主实现静默下载，使用这种方式的时候建议setShowNotification(false)，这样基本上用户就会对下载无感知了
            .setNeedFileMD5Check(false) //是否需要进行文件的MD5检验，如果开启需要提供文件本身正确的MD5校验码，DEMO中提供了获取文件MD5检验码的工具页面，也提供了加密工具类Md5Utils
            .setCustomDownloadConnectionCreator(OkHttp3Connection.Creator(builder))//如果你想使用okhttp作为下载的载体，可以使用如下代码创建一个OkHttpClient，并使用demo中提供的OkHttp3Connection构建一个ConnectionCreator传入，在这里可以配置信任所有的证书，可解决根证书不被信任导致无法下载apk的问题 //初始化
            .setModelClass(UpdateModel())
        //初始化
        AppUpdateUtils.init(this, updateConfig)
    }

}